// 反向递推
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 10;

int main() {
  int h, w;
  cin >> h >> w;

  // 读取网格数据，A[i][j]表示位置(i,j)的值
  vector<vector<int>> A(h + 1, vector<int>(w + 1));
  for (int i = 1; i <= h; i++)
    for (int j = 1; j <= w; j++)
      cin >> A[i][j];

  // f[i][j]表示从(i,j)到终点(h,w)所需的最小额外能量
  // 初始化为一个很大的值，表示不可达
  vector<vector<ll>> f(h + 1, vector<ll>(w + 1, 1e18));

  // P[k]表示对角线k上的能量值，k = i + j - 1
  vector<int> P(h + w + 1);
  for (int i = 1; i <= h + w - 1; i++)
    cin >> P[i];

  // 终点不需要额外能量
  f[h][w] = 0;

  // 从右下角到左上角进行反向递推
  for (int i = h; i >= 1; i--) {
    for (int j = w; j >= 1; j--) {
      // 当前位置的能量计算：加上对角线能量，减去当前位置消耗
      f[i][j] += P[i + j - 1] - A[i][j];

      // 能量不能为负数，最小为0
      f[i][j] = max(0ll, f[i][j]);

      // 向上传递能量到左边和上边的格子
      f[i - 1][j] = min(f[i - 1][j], f[i][j]);
      f[i][j - 1] = min(f[i][j - 1], f[i][j]);
    }
  }

  // 输出从起点(1,1)到终点所需的最小额外能量
  cout << f[1][1] << endl;
  return 0;
}